<?php

class Wlib_Form_Dojo_DojoBase extends Zend_Dojo_Form implements Wlib_Form_Metadata
{
    protected $_metadata = array();

    /**
     * Конструктор
     *
     * @param  array|Zend_Config|null $options
     * @return void
     */
    public function __construct($options = null)
    {
        $this->addPrefixPath('Wlib_Form_Dojo_Element_', 'Wlib/Form/Dojo/Element/', 'element')
             ->addPrefixPath('Wlib_Form_Dojo_Decorator', 'Wlib/Form/Dojo/Decorator', 'decorator');
        parent::__construct($options);
    }

    public function loadDefaultDecorators()
    {
        if ($this->loadDefaultDecoratorsIsDisabled()) {
            return $this;
        }

        $decorators = $this->getDecorators();
        if (empty($decorators)) {
            $this->addDecorator('FormElements')
                 ->addDecorator('HtmlTag', array('tag' => 'dl', 'class' => 'zend_form_dojo'))
                 ->addDecorator('ValidateOnSubmit')
                 ->addDecorator('DijitForm');
        }
        return $this;
    }

    /**
     * Устаналивает метаданные целиком
     *
     * @param  $metadata
     * @return Wlib_Form_Dojo_DojoBase
     */
    public function setMetadata($metadata)
    {
        foreach ($metadata as $key => $value) {
            $this->setMetadataParam($key, $value);
        }

        return $this;
    }

    /**
     * Получить методаные циликом
     *
     * @return array
     */
    public function getMetadata()
    {
        return $this->_metadata;
    }

    /**
     * Установить один параметр метаданных
     *
     * @param  $name Имя параметра
     * @param  $value Значение параметра
     * @return Wlib_Form_Dojo_DojoBase
     */
    public function setMetadataParam($name, $value)
    {
        $this->_metadata[$name] = $value;
        return $this;
    }

    /**
     * Получает один параметр метаданных
     *
     * @param  $name Имя параметра
     * @param  $default Значение по умолчанию. Возвращается в случае отсутствия параметра в метаданных
     * @return mixed
     */
    public function getMetadataParam($name, $default = null)
    {
        if(isset($this->_metadata[$name])) {
            return $this->_metadata[$name];
        }

        return $default;
    }
}